/**
 * 
 */
package kr.pe.johnkim.dayve.activity;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.json.JSONException;

import kr.pe.johnkim.dayve.provider.DayveCategory;
import kr.pe.johnkim.dayve.provider.DayveCategoryAdapter;
import kr.pe.johnkim.dayve.provider.DayveFavoriteAdapter;
import kr.pe.johnkim.dayve.provider.DayveFavoriteDatabaseHandler;
import kr.pe.johnkim.dayve.provider.DayveItem;
import kr.pe.johnkim.dayve.provider.DayveItemDatabaseHandler;
import kr.pe.johnkim.dayve.provider.DayveLog;
import kr.pe.johnkim.dayve.rest.DayveCategoryRest;
import kr.pe.johnkim.dayve.rest.DayveCommonRest;
import kr.pe.johnkim.dayve.rest.DayveItemRest;
import kr.pe.johnkim.dayve.util.DayveCommon;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.app.TabActivity;
import android.app.ActivityManager.RunningTaskInfo;
import android.content.ComponentName;
import android.content.ContentValues;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TabHost;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;

/**
 * My History 즐겨 찾기 화면 클래스이다.
 * 
 * @author johnkim
 *
 */
public class DayveFavoriteView extends ListActivity implements OnScrollListener {

	public static String TAG = DayveFavoriteView.class.getSimpleName();
	
	private String DAYVE_ID = "";
	
	// DatabaseHandler
	private DayveFavoriteDatabaseHandler favoriteDatabaseHandler;
	
	// Item DatatabsaeHandler
	private DayveItemDatabaseHandler itemDatabaseHandler;
	
	// 현재 시간.
	private String currentDate;
	
	// 목록 요청 갯수의 합.
	private int favoriteStart = 0;

	// 한번에 가져올 목록의 category 의 갯수.
	private int favoriteCount = 20;
	
	// 목록 요청 횟수의 합.
	private int requestCount = 0;
	
	// 프로그레스 바.
	ProgressBar favoriteCategoryProgressBar;
	
	// Favorite Notification.
	TextView txtViewFavoriteNotification;
	
	// Favorite Explain 버튼.
//	ImageView imgViewFavoriteExplain;
	
	// refresh 버튼.
	ImageView imgViewFavoriteRefresh;
	
	// Preference 버튼.
//	ImageView imgViewFavoritePreference;
	
	// adapter class.
	private DayveFavoriteAdapter dayveFavoriteAdapter;

	// 데이터 저장용 카테고리 리스트.
	private ArrayList<DayveCategory> favoriteList = null;

	// 화면 출력용 카테고리 리스트.
	private ArrayList<DayveCategory> favoriteViewList = null;

	DayveCategoryRest dayveCategoryRest = new DayveCategoryRest();
	DayveItemRest dayveItemRest = new DayveItemRest();
	DayveCommonRest dayveCommonRest = new DayveCommonRest();
	DayveCommon dayveCommon = new DayveCommon();

	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 101;

	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 102;

	// 카테고리 목록을 가져 와서 출력 한다..
	private static final int THREAD_CATEGORY_LIST = 103;

	// 카테고리 목록을 업데이트 한다.
	private static final int THREAD_CATEGORY_LIST_REFRESH = 104;

	// 카테고리 목록을 더 가져 온다.
	private static final int THREAD_CATEGORY_LIST_MORE = 105;

	// 카테고리 목록 가져오기에 성공하면 toast 를 띄운다.
	private static final int THREAD_CATEGORY_LIST_SUCCESS = 106;

	// 카테고리 목록 가져오기에 실패하면 dialog 창을 띄운다.
	private static final int THREAD_CATEGORY_LIST_FAIL = 107;
	
	// 프로그램을 종료 한다.
	private static final int ALERT_DIALOG_EXIT_ID = 108;
	
	private static final int THREAD_ITEM_LIST_FOR_CATEGORY_REFRESH = 109;
	
	// Refresh 버튼을 출력 한다.
	private static final int THREAD_REFRESH_BUTTON_APPEAR = 110;
	
	// Refresh 버튼을 감춘다.
	private static final int THREAD_REFRESH_BUTTON_DISAPPEAR = 111;
	
	// 화면 잠금.
	private boolean mLockListView = false;
	
	// 카테고리 등록 결과.
	public static String RESULT_CATEGORY_REGISTER = "";
	
	// 카테고리 수정 결과.
	public static String RESULT_CATEGORY_UPDATE = "";

	// 카테고리 삭제 결과.
	public static String RESULT_CATEGORY_DELETE = "";
	
	public static String RESULT_ALL_CATEGORY_UPDATE = "";

	public static String ACTIVITY_RESULT = "";
	
	public static Activity activity;

	/* (non-Javadoc)
	 * @see android.app.Activity#onCreate(android.os.Bundle)
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.dayve_favorite);
		
		activity = this;
		
		Log.i(TAG, "onCreate");
		
		// DatabaseHandler 를 연다.
//		favoriteDatabaseHandler = DatabaseHandler.open(getApplicationContext());
		
		// 설정 정보를 가져 온다.
		confirmNotification();
		
		// 현재 시간을 가져 온다.
		currentDate = dayveCommon.getCurrentDate();

		// 프로그레스 바를 정의 한다.
		favoriteCategoryProgressBar = (ProgressBar)findViewById(R.id.favoriteCategoryProgressBar);
		
		// Favorite Notification.
		txtViewFavoriteNotification = (TextView)findViewById(R.id.txtViewFavoriteNotification);
		txtViewFavoriteNotification.setVisibility(View.INVISIBLE);
		txtViewFavoriteNotification.setText(R.string.favorite_notification);
		
		// 뒤로 가기 버튼을 정의 한다.
//		imgViewFavoriteExplain = (ImageView)findViewById(R.id.imgViewFavoriteExplain);
		
		// refresh 버튼을 정의 한다.
		imgViewFavoriteRefresh = (ImageView)findViewById(R.id.imgViewFavoriteRefresh);
		
		// Preference 버튼을 정의 한다.
//		imgViewFavoritePreference = (ImageView)findViewById(R.id.imgViewFavoritePreference);
		
		/**
		 * Favorite Explain 화면으로 이동 한다.
		 */
//		imgViewFavoriteExplain.setOnClickListener(new View.OnClickListener() {
//
//			public void onClick(View arg0) {
//				// TODO Auto-generated method stub
//				Intent i = new Intent(DayveFavoriteView.this, DayveFavoriteExplainView.class);
//				startActivity(i);
//			}
//			
//		});
		
		/**
		 * Refresh 버튼을 터치 한다.
		 * 먼저 프로그레스 바를 출력한 뒤 refresh thread 를 시작 한다.
		 */
		imgViewFavoriteRefresh.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_LIST_REFRESH));
			}
			
		});
		
		// preference 버튼을 터치 한다.
//		imgViewFavoritePreference.setOnClickListener(new View.OnClickListener() {
//
//			public void onClick(View v) {
//				// TODO Auto-generated method stub
//				Intent i = new Intent(DayveFavoriteView.this, DayvePreferenceView.class);
//				startActivity(i);
//			}
//			
//		});

		// 화면에 출력하기 위한 리스트 생성.
		favoriteViewList = new ArrayList<DayveCategory>();

		// 카테고리 어댑터 생성.
		dayveFavoriteAdapter = new DayveFavoriteAdapter(getApplicationContext(), favoriteViewList);

		// list view 의 cursor 를 제공 하기 위해서 어댑터를 세팅 한다.
		setListAdapter(dayveFavoriteAdapter);

		// 스크롤 이벤트 리스너를 등록 한다.
		getListView().setOnScrollListener(this);

		//List 레이아웃 그리기 캐쉬를 설정 한다.
		getListView().setAlwaysDrawnWithCacheEnabled (true);

		/**
		 * 화면이 출력되면 Server 에 접속하지 않고 local Database 의 favorite Category 목록을 가져 온다.
		 */
//		mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_LIST));
		
	}
	
	/**
	 * SharedPreferences 정보를 확인 한다.
	 */
	public void confirmNotification() {
		String myPf = "kr.pe.johnkim.dayve.activity_preferences";
		SharedPreferences mSharedPreferences = getSharedPreferences(myPf, Activity.MODE_PRIVATE);
		
		// id 를 가져 온다.
		DAYVE_ID = mSharedPreferences.getString("dayve_id", "");
		// 한번에 가져올 목록의 갯수를 가져 온다.
		favoriteCount = Integer.parseInt(mSharedPreferences.getString("dayve_list_count", "20"));

	}
	
	/**
	 * Handler 를 정의한다.
	 * 모든 Thread 를 등록해 놓고 필요할때 호출한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			// 프로그레스 바를 출력 한다.
			case THREAD_PROGRESS_BAR_VISIBLE : 
				favoriteCategoryProgressBar.setVisibility(View.VISIBLE);
				txtViewFavoriteNotification.setVisibility(View.VISIBLE);
				break;
			// 프로그레스 바를 감춘다.
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				favoriteCategoryProgressBar.setVisibility(View.INVISIBLE);
				txtViewFavoriteNotification.setVisibility(View.INVISIBLE);
				break;
			// 카테고리 목록을 가져 와서 출력 한다.
			case THREAD_CATEGORY_LIST : 
				// 출력하기 전 기존의 화면 목록을 삭제 한다.
				favoriteViewList.clear();
				
//				// 카테고리 어댑터 생성.
//				dayveFavoriteAdapter = new DayveFavoriteAdapter(getApplicationContext(), favoriteViewList);
//
//				// list view 의 cursor 를 제공 하기 위해서 어댑터를 세팅 한다.
//				setListAdapter(dayveFavoriteAdapter);
				
				runOnUiThread(selectFavoriteCategoryList);
				
				break;
			// 카테고리 목록을 업데이트 한다.
			case THREAD_CATEGORY_LIST_REFRESH : 
//				favoriteViewList.clear();
				dayveFavoriteAdapter.notifyDataSetChanged();
				
//				categoryStart = 0;
//				requestCount = 0;
				
//				favoriteDatabaseHandler.deleteDayveCategory();
				threadSelectCategoryRefresh();
				break;
			// 카테고리 목록을 더 가져 온다.
			case THREAD_CATEGORY_LIST_MORE : 
				runOnUiThread(selectFavoriteCategoryList);
				break;
			// 카테고리 목록 가져오기에 성공하면 toast 를 띄운다.
			case THREAD_CATEGORY_LIST_SUCCESS : 
				break;
			// 카테고리 목록 가져오기에 실패하면 dialog 창을 띄운다.
			case THREAD_CATEGORY_LIST_FAIL : 
				break;
			// Item 목록을 refresh 한다.
			case THREAD_ITEM_LIST_FOR_CATEGORY_REFRESH : 
				threadSelectItemRefresh();
				break;
			// Refresh 버튼을 출력 한다.
			case THREAD_REFRESH_BUTTON_APPEAR : 
				imgViewFavoriteRefresh.setVisibility(View.VISIBLE);
				break;
			// Refresh 버튼을 감춘다.
			case THREAD_REFRESH_BUTTON_DISAPPEAR : 
				imgViewFavoriteRefresh.setVisibility(View.INVISIBLE);
				break;
			}
		}
	};
	
	/**
	 * 뒤로 가기 버튼을 터치하면 프로그램 종료 여부를 확인 한다.
	 */
	@Override
	protected Dialog onCreateDialog(int id) {

		AlertDialog dlg;

		switch (id) {
		case ALERT_DIALOG_EXIT_ID:
			dlg = new AlertDialog.Builder(this).setIcon(R.drawable.icon)
			.setTitle(getResources().getString(R.string.favorite_exit_program_title))
			.setMessage("\n" + getResources().getString(R.string.favorite_exit_program_message) + "\n")
			.setNegativeButton(getResources().getString(R.string.favorite_exit_program_button_cancel), 
					new DialogInterface.OnClickListener() {

				//                                @Override
				public void onClick(DialogInterface dialog, int which) {

				}
			}).setPositiveButton(getResources().getString(R.string.favorite_exit_program_button_ok), 
					new DialogInterface.OnClickListener() {

				//                                @Override
				public void onClick(DialogInterface dialog, int which) {
					// 아래의 모든 activity 를 닫는 종료 코드가 작동하지 않는다??
					ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
					am.restartPackage(getPackageName());

					// 다시 예전 방식으로 사용.
					System.exit(0);
				}
			}).show();

			break;

		default:
			break;
		}

		return super.onCreateDialog(id);

	}

	/* (non-Javadoc)
	 * @see android.app.ListActivity#onListItemClick(android.widget.ListView, android.view.View, int, long)
	 */
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		// TODO Auto-generated method stub
		super.onListItemClick(l, v, position, id);
		
		Intent i = new Intent(this, DayveCategoryAnalysisView.class);
		
		i.putExtra("position", position);
		
		i.putExtra("idMyHistoryCategories", favoriteViewList.get(position).getIdMyHistoryCategories());
		i.putExtra("name", favoriteViewList.get(position).getName());
		i.putExtra("comment", favoriteViewList.get(position).getComment());
		i.putExtra("iconUrl", favoriteViewList.get(position).getIconUrl());
		i.putExtra("openCategoryYn", favoriteViewList.get(position).getOpenCategoryYn());
		i.putExtra("favoriteYn", favoriteViewList.get(position).getFavoriteYn());
		i.putExtra("myHistoryMembersId", DAYVE_ID);
		
		// 호출한 부모 activity 명을 넘겨 준다.
		i.putExtra("parent_activity_name", "DayveFavoriteView");
		
		Log.i(TAG, "idMyHistoryCategories : " + favoriteViewList.get(position).getIdMyHistoryCategories());
		Log.i(TAG, "name                  : " + favoriteViewList.get(position).getName());
		Log.i(TAG, "comment               : " + favoriteViewList.get(position).getComment());
		Log.i(TAG, "iconUrl               : " + favoriteViewList.get(position).getIconUrl());
		Log.i(TAG, "openCategoryYn        : " + favoriteViewList.get(position).getOpenCategoryYn());
		Log.i(TAG, "favoriteYn            : " + favoriteViewList.get(position).getFavoriteYn());
		
		startActivityForResult(i, 0);
		
		ACTIVITY_RESULT = "ON";
	}

	/* (non-Javadoc)
	 * @see android.widget.AbsListView.OnScrollListener#onScroll(android.widget.AbsListView, int, int, int)
	 */
	public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
		// TODO Auto-generated method stub
		int count = totalItemCount - visibleItemCount;
		
		//스크롤 포지션이 가장 밑일 경우 목록을 더 가져온다.
		if(firstVisibleItem >= count && totalItemCount != 0 
				&& !mLockListView  && firstVisibleItem != 0) { 				
			mLockListView = true;
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_LIST_MORE));
		}
	}

	/* (non-Javadoc)
	 * @see android.widget.AbsListView.OnScrollListener#onScrollStateChanged(android.widget.AbsListView, int)
	 */
	public void onScrollStateChanged(AbsListView arg0, int arg1) {
		// TODO Auto-generated method stub
		
	}

	/* (non-Javadoc)
	 * @see android.app.Activity#onResume()
	 */
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		
//		if(favoriteDatabaseHandler == null || !favoriteDatabaseHandler.getSQLiteDatabase().isOpen()){ 
//			favoriteDatabaseHandler = DatabaseHandler.open(getApplicationContext());
//		}
		
		if(("").equals(RESULT_CATEGORY_REGISTER)) {
			Log.e(TAG, ">>>> onResume : RESULT_CATEGORY_UPDATE is space. --> THREAD_CATEGORY_LIST" );

			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_LIST));
		} else if(("SUCCESS").equals(RESULT_CATEGORY_REGISTER) && ("").equals(ACTIVITY_RESULT)) {

			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_LIST_REFRESH));
		}
		
		/**
		 * 화면 출력이 완료되면 onActivityResult 실행 파라메터를 초기화 한다.
		 */
		ACTIVITY_RESULT = "";
		
//		Toast.makeText(
//				this, 
//				"RESULT_CATEGORY_REGISTER : " + RESULT_CATEGORY_REGISTER + "\n" + 
//				"ACTIVITY_RESULT          : " + ACTIVITY_RESULT + "\n" + 
//				"nothing", 
//				Toast.LENGTH_SHORT
//				).show();
		
		// main thread 에서 child thread 를 호출 한다.
		Thread thread = new Thread(null, doBackgroundThreadProcessing, "Background_insertLog");
		thread.start();
	}

	/* (non-Javadoc)
	 * @see android.app.Activity#onStop()
	 */
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();

//		finish();
	}
	
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		
//		favoriteDatabaseHandler.close();
	}
	
	/* 뒤로 가기 버튼을 정의 한다.
	 * 
	 * @see android.app.Activity#onBackPressed()
	 */
	@Override
	public void onBackPressed() {
		// TODO Auto-generated method stub
		showDialog(ALERT_DIALOG_EXIT_ID);
//		super.onBackPressed();
	}
	
	/* 최상위 프로세스가 아닐 경우 프로세스를 종료 한다.
	 * 
	 * => Home Key 를 눌렀을때 프로세스를 종료 한다.
	 * 
	 * @see android.app.Activity#onPause()
	 */
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		
		if(!isForegrdound()) {
			System.exit(0);
		}
	}
	
	/**
	 * 현재 프로세스가 최상위로 실행중인지 검사 한다.
	 * 
	 * true : 최상위
	 * 
	 * @return
	 */
	public boolean isForegrdound() {
	    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
	    List<RunningTaskInfo> list = am.getRunningTasks(1);
	    ComponentName cn = list.get(0).topActivity;
	    String name = cn.getPackageName();
	     
	    return name.indexOf(getPackageName()) > -1;
	}
	
	/**
	 * category 등록/수정/비활성화 화면으로 갔다 올때 목록을 refresh 한다.
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		
//		if(("SUCCESS").equals(RESULT_CATEGORY_UPDATE)) {
//			mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_LIST_REFRESH));
//		}
//		
//		if(("SUCCESS").equals(RESULT_CATEGORY_DELETE)) {
//			// Category 가 삭제되었으면 Item 도 같이 refresh 한다.
////			selectItemRefresh();
//			mHandler.sendMessage(mHandler.obtainMessage(THREAD_ITEM_LIST_FOR_CATEGORY_REFRESH));
//		}

		if(requestCode == 0) {
			if(resultCode == RESULT_OK) {
				
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_LIST_REFRESH));
				
				if(("SUCCESS").equals(RESULT_CATEGORY_DELETE)) {
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_ITEM_LIST_FOR_CATEGORY_REFRESH));
				}
				
			}
		}

	}
	
	private void threadSelectItemRefresh() {
		Log.i(TAG, "threadSelectItemRefresh");
		
		// 프로그레스 바를 출력 한다.
//		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		favoriteList = new ArrayList<DayveCategory>();
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				selectItemRefresh();
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * server 에서 category 목록을 다시 가져 온다.
	 * 
	 * 실제 체크는 login 메소드에서 처리한다.
	 * 쓰레드로 돌리기 위한 임시 메소드 이다.
	 */
	private void threadSelectCategoryRefresh() {
		Log.i(TAG, "threadSelectCategoryRefresh");
		
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		favoriteList = new ArrayList<DayveCategory>();
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				selectCategoryRefresh();
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * server 에서 category 목록을 다시 가져 온다.
	 * 
	 * 모든 데이터를 한번에 다 가져 온다.
	 */
	private void selectCategoryRefresh() {
		Log.i(TAG, "selectCategoryRefresh");
		
		/**
		 * Refresh 버튼을 감춘다.
		 */
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_REFRESH_BUTTON_DISAPPEAR));
		
		/**
		 * Database 를 연다.
		 */
		favoriteDatabaseHandler = DayveFavoriteDatabaseHandler.open(getApplicationContext());
		
		// 기존의 데이터를 삭제 한다.
		favoriteDatabaseHandler.deleteDayveCategory();
		favoriteDatabaseHandler.close();
		
		DayveCategory parameterCategory = new DayveCategory();
		
		parameterCategory.setActivateYn("Y");
		parameterCategory.setCategoryStart(0);
		parameterCategory.setCategoryCount(1000000);		// 한번에 모두 가져오기 위해서 10000000.
		parameterCategory.setMyHistoryMembersId(DAYVE_ID);
		
		favoriteDatabaseHandler = DayveFavoriteDatabaseHandler.open(getApplicationContext());
		favoriteDatabaseHandler.beginTransaction();
		
		try {
			favoriteList = dayveCategoryRest.selectCategoryList(parameterCategory);
			
			Log.e(TAG, "categoryList size : " + favoriteList.size());
			
			for(int i=0 ; i<favoriteList.size() ; i++) {
				ContentValues values = new ContentValues();
				
				values.put("id_myhistory_categories", favoriteList.get(i).getIdMyHistoryCategories());
				values.put("name", favoriteList.get(i).getName());
				values.put("comment", favoriteList.get(i).getComment());
				values.put("icon_url", favoriteList.get(i).getIconUrl());
				values.put("open_category_yn", favoriteList.get(i).getOpenCategoryYn());
				values.put("favorite_yn", favoriteList.get(i).getFavoriteYn());
				values.put("activate_yn", favoriteList.get(i).getActivateYn());
				values.put("modify_date", favoriteList.get(i).getModifyDate());
				values.put("register_date", favoriteList.get(i).getRegisterDate());
				values.put("myhistory_members_id", favoriteList.get(i).getMyHistoryMembersId());
				values.put("items_count", favoriteList.get(i).getItemsCount());

				favoriteDatabaseHandler.insertDayveCategory(values);
			}
			
			favoriteDatabaseHandler.setTransactionSuccessful();
			
			Log.i(TAG, "Success to select category list.");
			
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			favoriteDatabaseHandler.endTransaction();
			
			if(favoriteDatabaseHandler != null) {
				favoriteDatabaseHandler.close();
			}
		}
		
		/**
		 * Refresh 가 종료되면 버튼을 출력 한다.
		 */
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_REFRESH_BUTTON_APPEAR));
		
		/**
		 * Database 를 닫는다.
		 */
		if(favoriteDatabaseHandler != null) {
			favoriteDatabaseHandler.close();
		}
		
		/**
		 * 출력하기 직전 기존의 화면 목록을 지운다.
		 */
//		favoriteViewList.clear();
		
		// server 에서 가져온 목록을 database 에 저장하면 화면에 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_CATEGORY_LIST));
		
		RESULT_CATEGORY_REGISTER = "";
		RESULT_CATEGORY_UPDATE = "";
		RESULT_CATEGORY_DELETE = "";
		ACTIVITY_RESULT = "";
	}
	
	/**
	 * Server 에서 Item 목록을 가져 와서 local database 에 저장 한다.
	 */
	private void selectItemRefresh() {
		Log.i(TAG, "selectItemRefresh");
		
		itemDatabaseHandler = DayveItemDatabaseHandler.open(getApplicationContext());
		
		ArrayList<DayveItem> itemList = new ArrayList<DayveItem>();
		
		DayveItem parameterItem = new DayveItem();
		
		parameterItem.setActivateYn("Y");
		parameterItem.setMyHistoryMembersId(DAYVE_ID);
		parameterItem.setItemStart(0);
		parameterItem.setItemCount(1000000);			// 한번에 모두 가져 오기 위해서 10000000.
		
		itemDatabaseHandler.beginTransaction();
		
		try {
			itemList = dayveItemRest.selectItemList(parameterItem);
			
			Log.i(TAG, "itemList.size() : " + itemList.size());
			
			for(int i=0 ; i<itemList.size() ; i++) {
				ContentValues values = new ContentValues();
				
				values.put("id_myhistory_items", itemList.get(i).getIdMyHistoryItems());
				values.put("name", itemList.get(i).getName());
				values.put("comment", itemList.get(i).getComment());
				values.put("amount", itemList.get(i).getAmount());
				values.put("open_item_yn", itemList.get(i).getOpenItemYn());
				values.put("favorite_yn", itemList.get(i).getFavoriteYn());
				values.put("activate_yn", itemList.get(i).getActivateYn());
				values.put("modify_date", itemList.get(i).getModifyDate());
				values.put("register_date", itemList.get(i).getRegisterDate());
				values.put("myhistory_members_id", itemList.get(i).getMyHistoryMembersId());
				values.put("myhistory_categories_id_myhistory_categories", itemList.get(i).getMyHistoryCategoriesIdMyHistoryCategories());
				
				itemDatabaseHandler.insertDayveItem(values);
			}
			
			itemDatabaseHandler.setTransactionSuccessful();
			
			Log.i(TAG, "Success to select item list.");
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			itemDatabaseHandler.endTransaction();
		}
		
		if(itemDatabaseHandler != null) {
			itemDatabaseHandler.close();
		}
	}
	
	/**
	 * Database 에서 favorite category 목록을 가져 와서 출력 한다.
	 * 
	 * 스크롤 이벤트에 의한 페이징 처리를 한다.
	 */
	private Runnable selectFavoriteCategoryList = new Runnable() {

		public void run() {
			// TODO Auto-generated method stub
			Log.i(TAG, "selectCategoryList");
			
			/**
			 * Database 를 연다.
			 */
			favoriteDatabaseHandler = DayveFavoriteDatabaseHandler.open(getApplicationContext());
			
			// 프로그레스 바를 출력 한다.
//			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
			
			if(!favoriteCategoryProgressBar.isShown()) {
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
			}
			
			String _id = "0";
			
			int listSize = favoriteViewList.size();
			
			if(listSize > 0 ) {
				_id = favoriteViewList.get(listSize-1).get_id();
			}
			
			ArrayList<DayveCategory> resultList = favoriteDatabaseHandler.selectFavoriteCategoryList(_id, "" + favoriteCount);
			
			favoriteViewList.addAll(resultList);
			
			if(resultList.size() < favoriteCount || 1000 < favoriteViewList.size()) {
				mLockListView = true;
			} else {
				mLockListView = false;
			}
			
			Log.e(TAG, "categoryViewList : " + favoriteViewList.size());
			
			// 만약 리스트가 없으면(등록된 카테고리가 없으면) toast 를 띄운다.
			if(favoriteViewList.size() < 1) {
				showNoListToast();
			}
			
			dayveFavoriteAdapter.notifyDataSetChanged();
			
			// 스크롤 이벤트의 페이징 처리를 위한 처리를 한다.
			requestCount++;
			favoriteStart = requestCount * favoriteCount;
			
			favoriteDatabaseHandler.close();
			
			// 프로그레스 바를 감춘다.
			mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
			
			RESULT_CATEGORY_REGISTER = "";
			
			/**
			 * Database 를 닫는다.
			 */
//			if(favoriteDatabaseHandler != null) {
//				favoriteDatabaseHandler.close();
//			}
		}
		
	};
	
	/**
	 * 출력할 목록이 없다는 Toast 를 띄운다.
	 */
	private void showNoListToast() {
		CharSequence text = getResources().getString(R.string.favorite_not_exist_list);
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}

	/**
	 * 로그를 저장 한다.
	 */
	private void insertLog() {
		Log.i(TAG, "insertLog");
		
		DayveLog dayveLog = new DayveLog();
		
		dayveLog.setId(DAYVE_ID);
		dayveLog.setViewName(TAG);
		dayveLog.setAccessDate(currentDate);
		
		try {
			dayveCommonRest.registerLog(dayveLog);
			Log.i(TAG, "Success to insert log.");
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			Log.e(TAG, "Fail to insert log.");
		}
	}
	
	/**
	 * 로그 저장은 UI 와 관계 없기 때문에 background thread 로 구현 함 : child thread
	 */
	private Runnable doBackgroundThreadProcessing = new Runnable() {
		
		public void run() {
			// TODO Auto-generated method stub
			insertLog();
		}
	};
	
	
	
}
